#ifndef _MODBUS_SLAVE_H
#define _MODBUS_SLAVE_H

#include "main.h"

#define SADDR485					1							// 从站地址
#define SBAUD485					USART2_BAUD

/* 01H 读强制单线圈 */
/* 05H 写强制单线圈 */
#define REG_D01		0x0001				// 分配的寄存器地址
#define REG_D02		0x0002
#define REG_D03		0x0003
#define REG_D04		0x0004
#define REG_DXX 	REG_D04

/* 02H 读取输入状态 */
#define REG_T01		0x0021
#define REG_T02		0x0022
#define REG_T03		0x0023
#define REG_T04		0x0024
#define REG_TXX		REG_T04

/* 03H 读保持寄存器 */
/* 06H 写保持寄存器 */
/* 10H 写多个保存寄存器 */
#define SLAVE_REG_P01		0x0031
#define SLAVE_REG_P02		0x0032

/* 04H 读取输入寄存器(模拟信号) */
#define REG_A01		0x0041
#define REG_AXX		REG_A01


/* RTU应答 异常码 */
#define RSP_OK						0			
#define RSP_ERR_CMD				0x01	/* 不支持的功能码 */
#define RSP_ERR_REG_ADDR	0x02	/* 寄存器地址错误 */
#define RSP_ERR_VALUE			0x03	/* 数据值域错误 */
#define RSP_ERR_WRITE			0x04	/* 写入失败 */

#define S_RX_BUF_SIZE			30		// 接收数据缓存区大小
#define S_TX_BUF_SIZE			128		// 发送数据缓存区大小

/* modbus数据处理结构体 */
typedef struct
{
	uint8_t RxBuf[S_RX_BUF_SIZE];
	uint8_t RxCount;
	uint8_t RxStatus;
	uint8_t RxNewFlag;

	uint8_t RspCode;

	uint8_t TxBuf[S_TX_BUF_SIZE];
	uint8_t TxCount;
} MODS_T;

// 移植时需要注意这个数组的值
extern uint8_t REG_DXX_Status[];
extern uint8_t REG_TXX_Status[];
extern uint16_t REG_P01_Value;
extern uint16_t REG_P02_Value;
extern uint16_t REG_A01_Value;

void MODS_Poll(void);
void MODS_ReceiveNew(uint8_t _byte);

#endif
